#include "scene.h"
#include <math.h>
#include <QtGlobal>
#include <QtCore/qmath.h>

//bool Scene::MoureEnemicsPepe()
//{
//    const int length = m_rows * m_columns;
//    QVector<cell_state_t> tmp(length, empty);
//    int from, r, c, hr, hc, fr, fc, id;
//    bool gameover = false;
//    HeroLocation(hr, hc);
//    from = 0;
//    for(int i = 0; i < length; ++i) tmp[i] = m_tauler.at(i);
//    for(int i = 0; !gameover && i < m_NumBaddies; ++i)
//    {
//        int e = EnemyLocation(from, tmp, id);
//        r = e / m_columns;
//        c = e % m_columns;

//        int aR = qAbs(hr - r);
//        int aC = qAbs(hc - c);
//        int nR = (hr < r)? -1: 1;
//        nR = (hr == r)? 0: nR;
//        int nC = (hc < c)? -1: 1;
//        nC = (hc == c)? 0: nC;

//        fr = r;
//        fc = c;
//        if( (aR + aC) == 1)
//        {
//            fr = hr;
//            fc = hc;
//            gameover = true;
//        }
//        else if(aR < aC)
//        {
//            /* Priority:
//                1.- Move to Hero in Column
//                2.- Move to Hero in Row
//                3.- Move backwards in Row
//                4.- Move backwards in Column
//                5.- Do nothing
//            */

//            if(m_tauler.at(r * m_columns + c + nC) == empty)
//            {
//                fc += nC;
//            }
//            else if(m_tauler.at((r + nR) * m_columns + c) == empty)
//            {
//                fr += nR;
//            }
//            else if(m_tauler.at((r - nR) * m_columns + c) == empty)
//            {
//                fr -= nR;
//            }
//            else if(m_tauler.at(r * m_columns + c - nC) == empty)
//            {
//                fc -= nC;
//            }
//            else {

//            }
//        }
//        else
//        {
//            /* Priority:
//                1.- Move to Hero in Row
//                2.- Move to Hero in Column
//                3.- Move backwards in Column
//                4.- Move backwards in Row
//                5.- Do nothing
//            */
//            if(m_tauler.at((r + nR) * m_columns + c) == empty)
//            {
//                fr += nR;
//            }
//            else if(m_tauler.at(r * m_columns + c + nC) == empty)
//            {
//                fc += nC;
//            }
//            else if(m_tauler.at(r * m_columns + c - nC) == empty)
//            {
//                fc -= nC;
//            }
//            else if(m_tauler.at((r - nR) * m_columns + c) == empty)
//            {
//                fr -= nR;
//            }
//            else {

//            }

//        }
//        m_tauler[r * m_columns + c] = empty;
//        m_tauler[fr * m_columns + fc] = (cell_state_t)(enemy0 + id);
//        from = e + 1;
//    }
//    return gameover;

//}

bool Scene::MoureEnemicsPepe()
{
    const int length = m_rows * m_columns;
    QVector<cell_state_t> tmp(length, empty);
    int from, r, c, hr, hc, fr, fc, id;
    bool gameover = false;
    HeroLocation(hr, hc);
    from = 0;
    for(int i = 0; i < length; ++i) tmp[i] = m_tauler.at(i);
    for(int i = 0; !gameover && i < m_NumBaddies; ++i)
    {
        int e = EnemyLocation(from, tmp, id);
        r = e / m_columns;
        c = e % m_columns;
        int angle = enemiesOrtientation.at(id);
        fr = r; fc = c;
        if(c > hc)
        {
            switch(angle)
            {
            case 0: AdvanceCharacter(1, fr, fc, angle, (cell_state_t)(enemy0 + id));
                        break;
            case 90: enemiesOrtientation[id] = 0;
                            break;
            case 180: AdvanceCharacter(-1, fr, fc, angle, (cell_state_t)(enemy0 + id));
                                break;
            case 270: enemiesOrtientation[id] = 0;
                                break;
            }
        }
        else if(c < hc)
        {
            switch(angle)
            {
            case 0: AdvanceCharacter(-1, fr, fc, angle, (cell_state_t)(enemy0 + id));
                        break;
            case 90: enemiesOrtientation[id] = 180; break;
            case 180: AdvanceCharacter(1, fr, fc, angle, (cell_state_t)(enemy0 + id));
                                break;
            case 270: enemiesOrtientation[id] = 180; break;
            }
        }
        else if(r > hr)
        {
            switch(angle)
            {
            case 0: enemiesOrtientation[id] = 270; break;
            case 90: AdvanceCharacter(-1, fr, fc, angle, (cell_state_t)(enemy0 + id));
                            break;
            case 180: enemiesOrtientation[id] = 270; break;
            case 270: AdvanceCharacter(1, fr, fc, angle, (cell_state_t)(enemy0 + id));
                            break;
            }
        }
        else if(r < hr)
        {
            switch(angle)
            {
            case 0: enemiesOrtientation[id] = 90; break;
            case 90: AdvanceCharacter(1, fr, fc, angle, (cell_state_t)(enemy0 + id));
                            break;
            case 180: enemiesOrtientation[id] = 90; break;
            case 270: AdvanceCharacter(-1, fr, fc, angle, (cell_state_t)(enemy0 + id));
            }
        }
            else
            {
                gameover = true;
            }
        from = e + 1;
        }
    return gameover;
    }
